object Demo17Match {
  def main(args: Array[String]): Unit = {
    /**
     * match ： Scala中的模式匹配
     * 类似Java中的switch
     *
     * 在Java中模式匹配可以匹配：
     * 1、基本数据类型
     * 2、字符串
     * 3、枚举enum
     *
     * 在Scala中模式匹配可以匹配：
     * 1、基本数据类型
     * 2、字符串
     * 3、枚举enum
     * 4、类型
     * 5、样例类的对象
     *
     */

    // 1、匹配基本数据类型
    val i: Int = 20

    i match {
      case 10 => println(10)
      case 20 => println(20)
      case _ => println("其他情况")
    }

    // 2、匹配字符串
    val str: String = "abcdfsdfdef"

    str match {
      case "abcdef" => println("abcdef")
      case "efgh" => println("efgh")
      case _ => println("其他情况") // 相当于Java中的default
    }

    // 3、匹配枚举
    val day: Weekday.Value = Weekday.Sunday
    day match {
      case Weekday.Monday => println("Monday")
      case Weekday.Tuesday => println("Tuesday")
      case Weekday.Wednesday => println("Wednesday")
      case Weekday.Thursday => println("Thursday")
      case Weekday.Friday => println("Friday")
      case _ => println("WeekDays")
    }

    // 4、匹配类型
    val any: Any = 1
    any match {
      case i: Int => println(s"这是一个Int类型的值:$i")
      case s: String => println(s"这是一个String类型的值:$s")
      case _ => println(s"这是其他类型的值:$any")
    }

    // 5、匹配样例类的对象
    val zs1: StuL = StuL("001", "zs", 20, "文科一班")
    val zs2: StuL = StuL("002", "zs", 20, "文科二班")
    zs2 match {
      case StuL("001", "zs", 20, "文科一班") => println("文科一班的张三")
      case StuL("002", "zs", 20, "文科二班") => println("文科二班的张三")
      case _ => println("其他班的同学")
    }

    // 模式匹配在Map中的应用
    val map: Map[String, Int] = Map[String, Int](("k1", 1), "k2" -> 2, "k3" -> 3)
    val key: String = "kk1"
    val maybeInt: Option[Int] = map.get(key)
    maybeInt match {
      case Some(v) => println(s"key存在，value为：${v}")
      case None => println("key不存在,则返回None")
    }

    // 手动实现getOrElse
    // 在Scala中的模式匹配可以有返回值
    val res: Any = maybeInt match {
      case Some(v) =>
        println(s"key存在，value为：${v}")
        v
      case None =>
        println("key不存在,则返回None")
        "未匹配到"
    }

    println(res)

    // 使用map方法在处理集合中的元素时 可以借助模式匹配 提高代码的可读性
    val stuList: List[(String, (String, Int), String)] = List[(String, (String, Int), String)](
      ("001", ("zs", 20), "文科二班"),
      ("002", ("ls", 22), "理科二班"),
      ("003", ("ww", 21), "文科四班"))

    stuList.map(t => {
      val id: String = t._1
      val nameAndAge: (String, Int) = t._2
      val name: String = nameAndAge._1
      val age: Int = nameAndAge._2
      val clazz: String = t._3
      (id, name, age, clazz)
    }).foreach(println)

    stuList.map {
      case (id: String, (name: String, age: Int), clazz: String) =>
        (id, name, age, clazz)
    }.foreach(println)

  }

}

object Weekday extends Enumeration {
  val Monday = Value("Mo.")
  val Tuesday = Value("Tu.")
  val Wednesday = Value("We.")
  val Thursday = Value("Th.")
  val Friday = Value("Fr.")
  val Saturday = Value("Sa.")
  val Sunday = Value("Su.")
}

